package com.swiftops.common.util;

import org.apache.commons.collections4.ListUtils;
import org.springframework.beans.BeanUtils;

import java.util.*;

public class ListUtil {

    /**
     * 创建空List
     *
     * @param <T>
     * @return
     */
    public static final <T> List<T> emptyList() {
        return Collections.emptyList();
    }

    /**
     * 如果参数为空返回 EMPTY_LIST 常量
     *
     * @param list 列表数据
     * @param <T>  列表类型
     * @return 返回结果
     */
    public static <T> List<T> emptyIfNull(List<T> list) {
        return list == null ? Collections.<T>emptyList() : list;
    }

    /**
     * 验证List为空
     *
     * @param coll 列表数据
     * @return 返回结果
     */
    public static boolean isEmpty(final Collection<?> coll) {
        return coll == null || coll.isEmpty();
    }

    /**
     * 验证List非空
     *
     * @param coll 列表数据
     * @return 返回结果
     */
    public static boolean isNotEmpty(final Collection<?> coll) {
        return !isEmpty(coll);
    }

    /**
     * 创建一个List
     *
     * @param arr 数组
     * @param <T> 入参出参类型
     * @return
     */
    public static final <T> List<T> createAList(T[] arr) {
        List<T> list = new LinkedList<>();
        for (T s : arr) list.add(s);
        return list;
    }

    /**
     * 创建一个字符串list
     *
     * @param args 字符串可变参数
     * @return
     */
    public static final List<String> createStringList(String... args) {
        List<String> list = new LinkedList<>();
        for (String s : args) list.add(s);
        return list;
    }

    /**
     * 拆分List
     *
     * @param list
     * @param size
     * @param <T>
     * @return
     */
    public static <T> List<List<T>> partition(final List<T> list, final int size) {
        return ListUtils.partition(list, size);
    }

    /**
     * 将源列表中的对象转换为目标类型的对象列表。
     *
     * @param sourceList  源对象列表
     * @param targetClass 目标对象的类
     * @param <T>         源对象的类型
     * @param <V>         目标对象的类型
     * @return 转换后的目标对象列表
     * @throws IllegalArgumentException 如果源列表为null或空，则抛出此异常
     */
    public static <T, V> List<V> convertList(List<T> sourceList, Class<V> targetClass) {
        // 检查输入的源列表是否为null或空
        if (sourceList == null || sourceList.isEmpty()) {
            return Collections.emptyList();
        }
        //
        // 创建结果列表来存储转换后的对象
        List<V> resultList = new ArrayList<>(sourceList.size());
        //
        // 遍历源列表中的每个元素，执行转换操作
        for (T source : sourceList) {
            try {
                V target = targetClass.newInstance();
                BeanUtils.copyProperties(source, target);
                resultList.add(target);
            } catch (InstantiationException | IllegalAccessException e) {
                throw new RuntimeException("Failed to create an instance of targetClass", e);
            }
        }
        return resultList;
    }
}
